# app/__init__.py
# 导入 os 模块，用于与操作系统进行交互，如获取环境变量等操作
import os
# 导入 timedelta 类，用于表示时间间隔，在设置 JWT 令牌过期时间时会用到
from datetime import timedelta

# 导入 redis 模块，用于与 Redis 数据库进行交互
import redis
# 从 flask 模块导入 Flask 类和 request 对象，Flask 类用于创建 Flask 应用实例，request 对象用于处理 HTTP 请求
from flask import Flask, request
# 从 flask_cors 模块导入 CORS 类，用于处理跨域资源共享问题
from flask_cors import CORS
# 从 flask_jwt_extended 模块导入 JWTManager 类，用于管理 JSON Web Token (JWT)
from flask_jwt_extended import JWTManager
# 从 flask_migrate 模块导入 Migrate 类，用于数据库迁移管理
from flask_migrate import Migrate
# 从 flask_sqlalchemy 模块导入 SQLAlchemy 类，用于集成 SQLAlchemy 数据库 ORM
from flask_sqlalchemy import SQLAlchemy
# 从 loguru 模块导入 logger 对象，用于日志记录
from loguru import logger
# 从 config 模块导入 Config 类，用于加载应用配置
from config import Config
# 从 app.log_service 模块导入 LogService 类，用于配置日志服务
from app.log_service import LogService

# 创建 SQLAlchemy 数据库实例
db = SQLAlchemy()
# 获取 Redis 服务器的主机地址，优先从环境变量中获取，如果环境变量未设置，则使用默认值 'localhost'
redis_host_url = os.getenv('REDIS_URL', 'localhost')
# 创建 Redis 客户端实例，连接到指定的 Redis 服务器
redis_client = redis.StrictRedis(host=redis_host_url, port=6379, db=0, decode_responses=True)




def create_app():
    """
    创建并配置 Flask 应用实例。

    Returns:
        Flask: 配置好的 Flask 应用实例。
    """
    # 创建 Flask 应用实例，指定静态文件夹为 'mini12306'
    app = Flask(__name__, static_folder='mini12306')
    # 启用跨域资源共享支持
    CORS(app)
    # 推送应用上下文，确保应用上下文在后续操作中可用
    app.app_context().push()
    # 从 Config 类加载应用配置
    app.config.from_object(Config)
    # 设置 JWT 访问令牌的过期时间为 30 天
    app.config['JWT_ACCESS_TOKEN_EXPIRES'] = timedelta(days=30)
    # 初始化 SQLAlchemy 数据库实例
    db.init_app(app)
    # 初始化数据库迁移管理
    Migrate(app, db)
    # 初始化 JWT 管理器
    JWTManager(app)
    # 配置日志服务
    LogService.configure_logging()

    # 导入各个蓝图模块
    from app.login_manager import login_bp
    from app.passenger_manager import register_bp
    from app.query_manager import query_bp
    from app.station_manager import station_bp
    from app.mobile_server import mobile_bp
    from app.train_manager import trains_bp
    from app.bank_server import bank_bp
    from app.id_card_server import id_card_bp
    from app.order_manager import order_bp

    # 注册各个蓝图到应用实例
    app.register_blueprint(login_bp)
    app.register_blueprint(register_bp)
    app.register_blueprint(query_bp)
    app.register_blueprint(station_bp)
    app.register_blueprint(mobile_bp)
    app.register_blueprint(trains_bp)
    app.register_blueprint(bank_bp)
    app.register_blueprint(id_card_bp)
    app.register_blueprint(order_bp)

    return app
